home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 10 / FM Towns Free Software Collection 10.iso / ms_dos / tool / dmove86 / console.c < prev    next >
Text File  |  1995-02-15  |  3KB  |  167 lines

  1. /*
  2.  
  3. dmove86 version 2.00c
  4.  
  5. console.c -- 画面初期設定/基礎処理ルーチン
  6.  
  7. Copyright (c) 1993,94 Delmonta
  8.  
  9. */
  10.  
  11. #include<stdio.h>
  12. #include<stdlib.h>
  13. #include<string.h>
  14. #include<jctype.h>
  15. #include"dmove86.h"
  16.  
  17. /*--------------------------------1文字入力----------------------------------*/
  18. static    char    Ungetch_buf[16];
  19. static    int    Ungetch_num = 0;
  20.  
  21. void    dm_ungetch(char c)
  22. {
  23.     Ungetch_buf[Ungetch_num++] = c;
  24. }
  25.  
  26. char    dm_getch(void)
  27. {
  28.     char    c;
  29.  
  30.     if    (Ungetch_num)        /* バッファに文字がたまっているか */
  31.         return Ungetch_buf[--Ungetch_num];
  32.  
  33. rep:
  34.     c = getch();
  35.  
  36.     if    (c=='\033' && kbhit())    /*  ファンクションキーを読みとばす */
  37.     {
  38.         getch();
  39.         goto rep;
  40.     }
  41.     else if    (c=='\0' && kbhit())    /* IBM PCの特殊キー */
  42.     {
  43.         switch    (getch())
  44.         {
  45.         case 0x48:    c = UPKEY;    break;
  46.         case 0x49:    c = RIGHTKEY;    break;
  47.         case 0x4a:    c = LEFTKEY;    break;
  48.         case 0x4b:    c = DOWNKEY;    break;
  49.         default:    goto rep;
  50.         }
  51.     }
  52.     else
  53.     {
  54.         switch    (c)    /* キャラクタコード変換 */
  55.         {
  56.         case '\n':    c = DOWNKEY;    break;    /* 98→TOWNS         */
  57.         case 'K'-0x40:    c = UPKEY;    break;
  58.         case 'L'-0x40:    c = RIGHTKEY;    break;
  59.  
  60.         case '\x1d':    c = LEFTKEY;    break;    /* TOWNS→98         */
  61.                             /* BSを処理するため  */
  62.  
  63.         case 'E'-0x40:    c = UPKEY;    break;    /* ダイヤモンドカーソル      */
  64.         case 'S'-0x40:    c = LEFTKEY;    break;
  65.         case 'D'-0x40:    c = RIGHTKEY;    break;
  66.         case 'X'-0x40:    c = DOWNKEY;    break;
  67.         }
  68.     }
  69.  
  70.     return c;
  71. }
  72. /*---------------------------------文字列入力--------------------------------*/
  73. int    strinput(char *buf,unsigned len)
  74. {
  75.     int        _ctypebuf[80];
  76.     int        *ctypebuf = _ctypebuf + 1;
  77.  
  78.     unsigned    l = 0;    /* 入力中の文字列の長さ */
  79.     unsigned    i;
  80.     char        c;
  81.  
  82.     _ctypebuf[0] = CT_ANK;
  83.  
  84.     while    ((c=*buf)!='\0')
  85.     {
  86.         putchar(c);
  87.  
  88.         *ctypebuf = chkctype(c,*(ctypebuf-1));
  89.  
  90.         buf++;
  91.         ctypebuf++;
  92.         l++;
  93.     }
  94.  
  95.     for    (i=l ; i<len ; i++)
  96.         putchar(' ');
  97.  
  98.     for    (i=l ; i<len ; i++)
  99.         putchar('\b');
  100.  
  101. rep:
  102.  
  103.     c = dm_getch();
  104.  
  105.     if    (c=='\b' && l)
  106.     {
  107.         do
  108.         {
  109.             printf("\b \b");
  110.             l--;
  111.             buf--;
  112.         } while( *--ctypebuf==CT_KJ2 || *ctypebuf==CT_ILGL);
  113.  
  114.     }
  115.     else if    (c=='\r' || c=='\033')
  116.     {
  117.         *buf = '\0';
  118.  
  119.         if    (c=='\r')
  120.             return 1;
  121.         else
  122.             return 0;
  123.     }
  124.     else if    (c>=' ' && l<len)
  125.     {
  126.         *ctypebuf = chkctype(c,*(ctypebuf-1));
  127.  
  128.         if    (*ctypebuf == CT_KJ1 && l==len-1)
  129.         {            /* バッファの最後に漢字の第1バイトが */
  130.             dm_getch();    /* 来た場合はその漢字全体を捨てる     */
  131.             putchar('\a');
  132.         }
  133.         else
  134.         {
  135.             l++;
  136.             *buf++ = c;
  137.             ctypebuf++;
  138.             putchar(c);
  139.         }
  140.     }
  141.     else        /* コントロールコード */
  142.         putchar('\a');
  143.  
  144.     goto rep;
  145. }
  146. /*------------------------------エラーメッセージ-----------------------------*/
  147. char    dm_errmes(char *s)
  148. {
  149.     char    c;
  150.     printf("\033[19;1H\033[33m%s\033[37m",s);
  151.  
  152.     c = dm_getch();
  153.  
  154.     printf("\033[19;1H\033[2K");
  155.     return c;
  156. }
  157.  
  158. void    mkscreen(void)
  159. {
  160.  
  161.     printf( "\033[1v\033[>5h\033[2J\033[0;37m"
  162.         "ディスクファイル並べ替えユーティリティ DMOVE86 Version 2.00c\n"
  163.         "                     Copyright (c) Delmonta all rights reserved, " __DATE__
  164.         "\033[22;1H"
  165.         "↑↓←→:カーソル移動 +-:ページ切替 H/?:ヘルプメッセージ\n");
  166. };
  167.